﻿/****************************************************************************
** file: TemplateMatch.h
** brief: 模板匹配算法的相关的几个函数。
** Copyright (C) LiYuan
** Author: LiYuan
** E-Mail: 18069211#qq(.)com
** Version 1.0.0
** Last modified: 2024.4.3
** Modified By: LiYuan
****************************************************************************/

#ifndef TEMPLATEMATCH_H
#define TEMPLATEMATCH_H

#include <vector>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>

namespace Qly {


[[deprecated]]
double templateMatch(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask, int method,
                                    cv::Point &point) noexcept;

bool templateMatch(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask, int method,
                   cv::Point &point, double &score) noexcept;
bool templateMatch(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask, int method,
                   cv::Rect &rect, double &score) noexcept;

/**
 * @brief templateMatchSubPixel 亚像素精度的模板匹配
 * @param image 输入图像
 * @param tepl 模板图像
 * @param mask 掩膜图像，如果没有，可以填写 cv::Mat()
 * @param method 支持 TM_SQDIFF， TM_SQDIFF_NORMED， TM_CCORR， TM_CCOEFF， TM_CCORR_NORMED， TM_CCOEFF_NORMED
 * @param point 返回匹配出的最佳位置，这个点对应模板的左上角位置
 * @param score 匹配的分数
 * @return
 */
bool templateMatchSubPixel(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask, int method,
                   cv::Point2f &point, double &score) noexcept;
bool templateMatchSubPixel(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask, int method,
                   cv::Rect2f &rect, double &score) noexcept;

/**
 * @brief templateMatchCCORR CCORR 准则的模板匹配，之所以单独拿出来，是因为这个实测最快
 * @param image 输入图像
 * @param tepl 模板图像
 * @param mask 掩膜图像，如果没有，可以填写 cv::Mat()
 * @param point 输出匹配点坐标
 * @param score 匹配度，越大越好
 * @return
 */
bool templateMatchCCORR(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                        cv::Point &point, double &score) noexcept;
bool templateMatchCCORR(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                        cv::Rect &rect, double &score) noexcept;

/**
 * @brief templateMatchSubPixelCCORR CCORR 准则的模板匹配，之所以单独拿出来，是因为这个实测最快。亚像素精度。
 * @param image 输入图像
 * @param tepl 模板图像
 * @param mask 掩膜图像，如果没有，可以填写 cv::Mat()
 * @param point 输出匹配点坐标
 * @param score 匹配度，越大越好
 * @return
 */
bool templateMatchSubPixelCCORR(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                        cv::Point2f &point, double &score) noexcept;
bool templateMatchSubPixelCCORR(const cv::Mat &image, const cv::Mat &tep, const cv::Mat &maskl,
                        cv::Rect2f &rect, double &score) noexcept;


/**
 * @brief templateMatchCCORR_NORMED  CCORR_NORMED准则的模板匹配，之所以单独拿出来，是因为这个在归一化的匹配方法中实测最快
 * @param image 输入图像
 * @param tepl 模板图像
 * @param mask 掩膜图像，如果没有，可以填写 cv::Mat()
 * @param point 输出匹配点坐标
 * @param score 匹配度，1 表示最佳匹配，0表示不匹配，-1表示反向匹配
 * @return
 */
bool templateMatchCCORR_NORMED(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                               cv::Point &point, double &score) noexcept;
bool templateMatchCCORR_NORMED(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                               cv::Rect &rect, double &score) noexcept;
bool templateMatchSubPixelCCORR_NORMED(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                               cv::Point2f &point, double &score) noexcept;
bool templateMatchSubPixelCCORR_NORMED(const cv::Mat &image, const cv::Mat &tepl, const cv::Mat &mask,
                               cv::Rect2f &rect, double &score) noexcept;

bool templateMatchCCOEFF_NORMED(const cv::Mat &image, const cv::Mat &model, const cv::Mat &mask,
                                cv::Point &point, double &score) noexcept;
bool templateMatchCCOEFF_NORMED(const cv::Mat &image, const cv::Mat &model, const cv::Mat &mask,
                                cv::Rect &rect, double &score) noexcept;
bool templateMatchSubPixelCCOEFF_NORMED(const cv::Mat &image, const cv::Mat &model, const cv::Mat &mask,
                                cv::Point2f &point, double &score) noexcept;
bool templateMatchSubPixelCCOEFF_NORMED(const cv::Mat &image, const cv::Mat &model, const cv::Mat &mask,
                                cv::Rect2f &rect, double &score) noexcept;



}
#endif // TEMPLATEMATCH_H
